#include "MyQjson.h"
#include <QFile>


//typedef struct _DAT_ARRY
//{
//   uint16_t  header;          // 帧头
//   uint8_t   data_type;       // 数据类型
//   uint8_t   data_ptr;        // 数据开始位置
//   uint8_t   data_len;        // 数据解析长度
//   int16_t   offset;          // 数据偏置
//   float     dis_real_coff;   // 显示值和实际值的倍率
//}sDatArry;

// 假设我们要插入的JSON对象是这样的
QJsonObject createNewJsonObject( QS_sDatArry Dat)
{
    QJsonObject obj;

    obj["01_var_name"]      = Dat.QS_var_name;
    obj["02_frame_id"]      = Dat.QS_frame_id;
    obj["03_header"]        = Dat.QS_header;
    obj["04_data_type"]     = Dat.QS_data_type;
    obj["05_data_ptr"]      = Dat.QS_data_ptr;
    obj["06_data_len"]      = Dat.QS_data_len;
    obj["07_offset"]        = Dat.QS_offset;
    obj["08_dis_real_coff"] = Dat.QS_dis_real_coff;
    obj["09_up_Limt"]       = Dat.QS_up_Limt;
    obj["10_dn_Limt"]       = Dat.QS_dn_Limt;

    return obj;
}


enum {
    Success,
    FileOpenForReadFailed,
    FileOpenForWriteFailed,
    InvalidJsonFormat,
    UnknownError
};


// 插入json数组成员到文件，或新建json文件
uint16_t insertIntoOrCreateJsonFile(const QString &filePath, const QJsonObject &newObject)
{
    QFile file(filePath);
    QJsonArray jsonArray;

    // 尝试读取现有文件
    if (file.exists())
    {
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            return FileOpenForReadFailed;
        }
        QByteArray jsonData = file.readAll();
        QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
        file.close();

        if (!jsonDoc.isArray())
        {
            return InvalidJsonFormat;
        }
        jsonArray = jsonDoc.array();
    }
    // 将新对象添加到数组
    jsonArray.append(newObject);
    // 写入新数据到文件
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        return FileOpenForWriteFailed;
    }
    QTextStream out(&file);
    // !!!确保以UTF8 编码写入,不能删除
    out.setCodec("UTF - 8");
    out << QJsonDocument(jsonArray).toJson(QJsonDocument::Indented);
    if (out.status() != QTextStream::Ok)
    {
        file.close();
        return UnknownError; // 实际上QTextStream很少会失败，但我们可以保留这个选项以防万一
    }
    file.close();
    return Success; // 成功
}

// 从文件中读取JSON数组
QJsonArray readJsonArrayFromFile(const QString& filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "Failed to open file for reading:" << filePath;
        // 可以在这里抛出一个异常或者返回一个空的QJsonArray作为错误处理
        return QJsonArray();
    }

    QByteArray jsonData = file.readAll();
    file.close();

    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
    if (jsonDoc.isNull() || !jsonDoc.isArray())
    {
        qDebug() << "The JSON document is either empty or not an array:" << filePath;
        // 同样，返回空的QJsonArray或抛出异常
        return QJsonArray();
    }
    return jsonDoc.array();
}


QList<sValArry> parseJsonArray(const QJsonArray &jsonArray)
{
    QList<sValArry> result;

    for (const QJsonValue &value : jsonArray)
    {
        if (!value.isObject())
        {
            qDebug() << "Expected a JSON object in the array";
            continue;
        }

        QJsonObject jsonObject = value.toObject();

        sValArry valArry;
        valArry.var_name          = jsonObject["01_var_name"].toString();
        valArry.frame_id          = jsonObject["02_frame_id"].toString().toUInt(nullptr, 16);
        valArry.header            = jsonObject["03_header"].toString().toUInt(nullptr, 16);
        valArry.data_type         = jsonObject["04_data_type"].toString().toUInt(nullptr);
        valArry.data_ptr          = jsonObject["05_data_ptr"].toString().toUInt(nullptr);
        valArry.data_len          = jsonObject["06_data_len"].toString().toUInt(nullptr);
        valArry.offset            = jsonObject["07_offset"].toString().toUInt(nullptr);
        valArry.dis_real_coff     = jsonObject["08_dis_real_coff"].toString().toDouble(nullptr);
        valArry.up_Limt           = jsonObject["09_up_Limt"].toString().toDouble(nullptr);
        valArry.dn_Limt           = jsonObject["10_dn_Limt"].toString().toDouble(nullptr);
        valArry.header_ptr        = jsonObject["11_header_ptr"].toString().toUInt(nullptr);
        valArry.header_len        = jsonObject["12_header_len"].toString().toUInt(nullptr);
        valArry.sci_1Master2Slave = jsonObject["13_SCI_1Master2Salve"].toString().toUInt(nullptr);
        valArry.sci_Addr          = jsonObject["14_SCI_Addr"].toString().toUInt(nullptr,16);
        valArry.sci_Data_Type     = jsonObject["15_SCI_Data_Type"].toString().toUInt(nullptr);
        valArry.sci_0Big1Little   = jsonObject["16_SCI_0Big1Little"].toString().toUInt(nullptr);

        result.append(valArry);

    }
    return result;
}
